#Makefile:

builddir = ./bin/objets

CC       = g++
CXX      = g++
INCPATH = -Isrc/
LIBPATH  = -lpng -lz -ljpeg -DNO_FREETYPE
CPPFLAGS += -O2 -Wall -ansi -pedantic
CXXFLAGS += -O2 -Wall -ansi -pedantic
EXEC     = Raytracer++.exe
BATCH    = Raytracer++-batch.exe

# Pour s'assurer qu'aucune erreur ne survit
#CPPFLAGS = -Wall -Werror -Wfatal-errors
#CXXFLAGS = -Wall -Werror -Wfatal-errors

# Pour pouvoir debugger (avec gdb par exemple)
CPPFLAGS = -g -pg -ansi -pedantic
CXXFLAGS = -g -pg -ansi -pedantic

#Objet des tests
OBJTESTS = bin/objets/tests/testFormeComposee.o				\
bin/objets/tests/testJpeg.o bin/objets/tests/testSphere.o		\
bin/objets/tests/testPlan.o bin/objets/tests/testTiff.o			\
bin/objets/tests/testParallelepipede.o bin/objets/tests/testPng.o	\
bin/objets/tests/testCylindre.o bin/objets/tests/testMatrice.o		\
bin/objets/tests/testSolveur.o bin/objets/tests/testTore.o		\
bin/objets/tests/testCubeTroue.o bin/objets/tests/testParser.o		\
bin/objets/tests/testCone.o bin/objets/tests/testBruit.o		\
bin/objets/tests/testHyperboloide.o					\
bin/objets/tests/testIntegrateur.o bin/objets/tests/testPoint.o		\
bin/objets/tests/testFonction.o bin/objets/tests/testCouleur.o

OBJALGEBRE = bin/objets/Algebre/Coord.o bin/objets/Algebre/Vecteur.o	\
bin/objets/Algebre/Matrice3x3.o bin/objets/Algebre/MatriceGL3.o		\
bin/objets/Algebre/MatriceO3.o bin/objets/Algebre/MatriceSO3.o		\
bin/objets/Algebre/ConstruitMatrice.o					\
bin/objets/Algebre/Transformation.o bin/objets/Algebre/Solveur.o

OBJBRUIT = bin/objets/Bruit/Bruit.o bin/objets/Bruit/perlin.o

OBJFORMES = bin/objets/Formes/Forme.o					\
bin/objets/Formes/FormeComposee.o bin/objets/Formes/Cone.o		\
bin/objets/Formes/Cube.o bin/objets/Formes/CubeTroue.o			\
bin/objets/Formes/Cylindre.o bin/objets/Formes/Dodecaedre.o		\
bin/objets/Formes/Icosaedre.o bin/objets/Formes/Octaedre.o		\
bin/objets/Formes/Plan.o bin/objets/Formes/Parallelepipede.o		\
bin/objets/Formes/Pyramide.o bin/objets/Formes/Sphere.o			\
bin/objets/Formes/Tetraedre.o bin/objets/Formes/Tore.o			\
bin/objets/Formes/Ellipsoide.o bin/objets/Formes/FormeInfinie.o		\
bin/objets/Formes/BaseCylindre.o bin/objets/Formes/BaseCone.o		\
bin/objets/Formes/BaseParaboloide.o bin/objets/Formes/Paraboloide.o	\
bin/objets/Formes/BaseHyperboloide.o					\
bin/objets/Formes/Hyperboloide.o					\
bin/objets/Formes/Equipotentielle.o bin/objets/Formes/MetaBalle.o

OBJIMAGE = bin/objets/Image/Image.o bin/objets/Image/ImageFile.o	\
bin/objets/Image/ImageFilePng.o bin/objets/Image/ImageFilePPM.o		\
bin/objets/Image/ImageFileTiff.o bin/objets/Image/pngwriter.o		\
bin/objets/Image/ReadImageFile.o bin/objets/Image/tiffwrite.o		\
bin/objets/Image/ImageFileJpeg.o

OBJLUMIERES = bin/objets/Lumieres/Ambiante.o				\
bin/objets/Lumieres/Lumiere.o bin/objets/Lumieres/SourceAttenuee.o	\
bin/objets/Lumieres/Source.o

OBJMATERIAUX = bin/objets/Materiaux/Materiau.o				\
bin/objets/Materiaux/AplatCouleur.o bin/objets/Materiaux/EffetBase.o	\
bin/objets/Materiaux/Carreaux.o bin/objets/Materiaux/EffetBois.o	\
bin/objets/Materiaux/Marbre.o bin/objets/Materiaux/Melange.o		\
bin/objets/Materiaux/MultiCouleurs.o bin/objets/Materiaux/Texture.o

OBJNOYAU = bin/objets/Noyau/Camera.o bin/objets/Noyau/Capteur.o	\
bin/objets/Noyau/Cellule.o bin/objets/Noyau/ComposantCouleur.o	\
bin/objets/Noyau/Couleur.o bin/objets/Noyau/Ecran.o		\
bin/objets/Noyau/Environnement.o bin/objets/Noyau/Objet.o	\
bin/objets/Noyau/Rayon.o

OBJUTILS = bin/objets/Utils/CColor.o bin/objets/Utils/debugstreams.o	\
 bin/objets/Utils/Erreur.o bin/objets/Utils/StatusCode.o

OBJXML = bin/objets/Xml/ElementDOM.o bin/objets/Xml/InterpreteXML.o	\
bin/objets/Xml/Parser.o

ALLLIBS = bin/libs/libalgebre.a bin/libs/libbruit.a			\
bin/libs/libformes.a bin/libs/libimage.a bin/libs/liblumieres.a	\
bin/libs/libmateriaux.a bin/libs/libnoyau.a bin/libs/libutils.a	\
bin/libs/libxml.a

all: $(EXEC) $(BATCH) libs

clean: 
	rm -f bin/objets/*.o bin/objets/Algebre/*.o			\
bin/objets/Bruit/*.o bin/objets/Formes/*.o bin/objets/Image/*.o		\
bin/objets/Lumieres/*.o bin/objets/Materiaux/*.o bin/objets/tests/*.o	\
bin/objets/Utils/*.o bin/objets/Xml/*.o

mrproper: clean 
	rm -f *.exe bin/tests/*.exe $(ALLLIBS)

# Libraires partagées.
libs: $(ALLLIBS)

bin/libs/libalgebre.a: $(OBJALGEBRE)
	ar rcs -o $@ $^

bin/libs/libbruit.a: $(OBJBRUIT)
	ar rcs -o $@ $^

bin/libs/libformes.a: $(OBJFORMES)
	ar rcs -o $@ $^

bin/libs/libimage.a: $(OBJIMAGE)
	ar rcs -o $@ $^

bin/libs/liblumieres.a: $(OBJLUMIERES)
	ar rcs -o $@ $^

bin/libs/libmateriaux.a: $(OBJMATERIAUX)
	ar rcs -o $@ $^

bin/libs/libnoyau.a: $(OBJNOYAU)
	ar rcs -o $@ $^

bin/libs/libutils.a: $(OBJUTILS)
	ar rcs -o $@ $^

bin/libs/libxml.a: $(OBJXML)
	ar rcs -o $@ $^

# Programme executant le lancer de rayon

$(EXEC): bin/objets/RJRay.o libs
	g++ -o $@ $(filter-out libs, $^) $(ALLLIBS) $(ALLLIBS)	\
$(ALLLIBS) $(LIBPATH)

# Programme executant le lancer de rayon (sans interaction avec
# l'utilisateur).
$(BATCH): bin/objets/RJRay-batch.o libs
	g++ -o $@ $(filter-out libs, $^) $(ALLLIBS) $(ALLLIBS)	\
$(ALLLIBS) $(LIBPATH)

# Les tests
tests : bin/tests/testPng.exe bin/tests/testMatrice.exe		\
 bin/tests/testSolveur.exe bin/tests/testCylindre.exe		\
 bin/tests/testTore.exe bin/tests/testCubeTroue.exe		\
 bin/tests/testCone.exe bin/tests/testBruit.exe			\
 bin/tests/testParser.exe bin/tests/testHyperboloide.exe	\
 bin/tests/testIntegrateur.exe bin/tests/testPoint.exe		\
 bin/tests/testFonction.exe bin/tests/testCouleur.exe

# Teste l'utilisation de pngwriter
bin/tests/testPng.exe: bin/objets/Couleur.o			\
 bin/objets/ComposantCouleur.o bin/objets/Utils/Erreur.o	\
 bin/objets/tests/testPng.o bin/objets/Ecran.o			\
 bin/objets/Image/Image.o bin/objets/Image/ImageFile.o		\
 bin/objets/Image/ImageFilePng.o bin/objets/Image/pngwriter.o	\
 bin/objets/Algebre/Coord.o bin/objets/Utils/debugstreams.o	\
 bin/objets/Utils/CColor.o
	c++ $(LIBPATH) -o $@ $^

# Teste les matrices 3x3
bin/tests/testMatrice.exe: bin/objets/Algebre/Coord.o		\
bin/objets/Algebre/Vecteur.o bin/objets/Algebre/Matrice3x3.o	\
bin/objets/Algebre/MatriceGL3.o bin/objets/Algebre/MatriceO3.o	\
bin/objets/Algebre/MatriceSO3.o bin/objets/Utils/Erreur.o	\
bin/objets/tests/testMatrice.o
	g++ $(LIBPATH) -o $@ $^

# Teste le solveur d'équations
bin/tests/testSolveur.exe: bin/objets/Algebre/Solveur.o	\
bin/objets/tests/testSolveur.o
	g++ $(LIBPATH) -o $@ $^

# Teste l'intégrateur numérique
bin/tests/testIntegrateur.exe : bin/objets/tests/testIntegrateur.o	\
bin/objets/Algebre/Point.o bin/objets/Algebre/Fonction.o		\
bin/objets/Algebre/Integrateur.o bin/objets/Utils/debugstreams.o	\
bin/objets/Utils/CColor.o
	g++ $(LIBPATH) $(INCPATH) -o $@ $^

# Teste le point (template pour intégration)
bin/tests/testPoint.exe : bin/objets/tests/testPoint.o	\
bin/objets/Algebre/Point.o
	g++ $(LIBPATH) $(INCPATH) -o $@ $^

bin/tests/testFonction.exe : bin/objets/tests/testFonction.o \
bin/objets/Algebre/Point.o bin/objets/Algebre/Fonction.o
	g++ $(LIBPATH) $(INCPATH) -o $@ $^


bin/tests/testCouleur.exe : bin/objets/tests/testCouleur.o	\
bin/objets/ComposantCouleur.o bin/objets/Couleur.o		\
bin/objets/ComposantCouleur.o bin/objets/Utils/debugstreams.o	\
bin/objets/Utils/CColor.o
	g++ $(LIBPATH) $(INCPATH) -o $@ $^

# Tests des formes de base
# Le plan
bin/tests/testplan.exe: bin/objets/Algebre/Coord.o			\
  bin/objets/Algebre/Vecteur.o bin/objets/Algebre/Matrice3x3.o		\
  bin/objets/Algebre/MatriceGL3.o bin/objets/Algebre/MatriceO3.o	\
  bin/objets/Algebre/MatriceSO3.o bin/objets/Algebre/Transformation.o	\
  bin/objets/Algebre/Solveur.o bin/objets/Algebre/ConstruitMatrice.o	\
  bin/objets/Couleur.o bin/objets/Rayon.o bin/objets/Formes/Plan.o	\
  bin/objets/Formes/Forme.o bin/objets/Materiaux/Materiau.o		\
  bin/objets/Materiaux/Carreaux.o bin/objets/Utils/Erreur.o		\
  bin/objets/Utils/debugstreams.o bin/objets/Utils/CColor.o		\
  bin/objets/Utils/StatusCode.o bin/objets/tests/testplan.o
	g++ $(LIBPATH) -o $@  $^

# Tests des différentes formes ajoutées
# Le cylindre
bin/tests/testCylindre.exe: bin/objets/Algebre/Coord.o			\
bin/objets/Algebre/Vecteur.o bin/objets/Algebre/Matrice3x3.o		\
bin/objets/Algebre/MatriceGL3.o bin/objets/Algebre/MatriceO3.o		\
bin/objets/Algebre/MatriceSO3.o bin/objets/Algebre/Transformation.o	\
bin/objets/Algebre/Solveur.o bin/objets/Algebre/ConstruitMatrice.o	\
bin/objets/Couleur.o bin/objets/ComposantCouleur.o			\
bin/objets/Rayon.o bin/objets/Formes/Cylindre.o				\
bin/objets/Formes/Forme.o bin/objets/Formes/Plan.o			\
bin/objets/Formes/FormeComposee.o bin/objets/Formes/BaseCylindre.o	\
bin/objets/Formes/FormeInfinie.o bin/objets/Utils/Erreur.o		\
bin/objets/Utils/debugstreams.o bin/objets/Utils/CColor.o		\
bin/objets/Utils/StatusCode.o bin/objets/tests/testCylindre.o
	g++ $(LIBPATH) -o $@  $^

# L'ellipsoide
bin/tests/testEllipsoide.exe: libs bin/objets/tests/testEllipsoide.o	\
bin/objets/Couleur.o bin/objets/ComposantCouleur.o			\
bin/objets/Environnement.o bin/objets/Objet.o bin/objets/Rayon.o	\
bin/objets/Camera.o bin/objets/Ecran.o bin/objets/Cellule.o
	g++ $(INCPATH) -o $@ $(filter-out libs, $^) $(ALLLIBS)	\
$(ALLLIBS) $(ALLLIBS) $(LIBPATH)

# Le tore
bin/tests/testTore.exe: bin/objets/Algebre/Coord.o		\
bin/objets/Algebre/Vecteur.o bin/objets/Algebre/Matrice3x3.o	\
bin/objets/Algebre/MatriceGL3.o bin/objets/Algebre/MatriceO3.o	\
bin/objets/Algebre/MatriceSO3.o bin/objets/Algebre/Solveur.o	\
bin/objets/Algebre/Transformation.o				\
bin/objets/Algebre/ConstruitMatrice.o bin/objets/Couleur.o	\
bin/objets/ComposantCouleur.o bin/objets/Rayon.o		\
bin/objets/Formes/Tore.o bin/objets/Formes/Forme.o		\
bin/objets/Formes/Plan.o bin/objets/tests/testTore.o		\
bin/objets/Utils/Erreur.o bin/objets/Utils/debugstreams.o	\
bin/objets/Utils/CColor.o bin/objets/Utils/StatusCode.o
	g++ $(LIBPATH) -o $@  $^

# Le "cube troué"
bin/tests/testCubeTroue.exe: bin/objets/Algebre/Coord.o		\
bin/objets/Algebre/Vecteur.o bin/objets/Algebre/Matrice3x3.o	\
bin/objets/Algebre/MatriceGL3.o bin/objets/Algebre/MatriceO3.o	\
bin/objets/Algebre/MatriceSO3.o bin/objets/Algebre/Solveur.o	\
bin/objets/Algebre/Transformation.o				\
bin/objets/Algebre/ConstruitMatrice.o bin/objets/Couleur.o	\
bin/objets/ComposantCouleur.o bin/objets/Rayon.o		\
bin/objets/Formes/CubeTroue.o bin/objets/Formes/Forme.o	\
bin/objets/Formes/Plan.o bin/objets/tests/testCubeTroue.o	\
bin/objets/Utils/Erreur.o bin/objets/Utils/debugstreams.o	\
bin/objets/Utils/CColor.o bin/objets/Utils/StatusCode.o
	g++ $(LIBPATH) -o $@  $^

# Le cône
bin/tests/testCone.exe: bin/objets/Algebre/Coord.o		\
bin/objets/Algebre/Vecteur.o bin/objets/Algebre/Matrice3x3.o	\
bin/objets/Algebre/MatriceGL3.o bin/objets/Algebre/MatriceO3.o	\
bin/objets/Algebre/MatriceSO3.o bin/objets/Algebre/Solveur.o	\
bin/objets/Algebre/Transformation.o				\
bin/objets/Algebre/ConstruitMatrice.o bin/objets/Couleur.o	\
bin/objets/ComposantCouleur.o bin/objets/Rayon.o		\
bin/objets/Formes/Cone.o bin/objets/Formes/BaseCone.o		\
bin/objets/Formes/Forme.o bin/objets/Formes/FormeInfinie.o	\
bin/objets/Formes/FormeComposee.o bin/objets/Formes/Plan.o	\
bin/objets/tests/testCone.o bin/objets/Utils/Erreur.o		\
bin/objets/Utils/debugstreams.o bin/objets/Utils/CColor.o	\
bin/objets/Utils/StatusCode.o
	g++ $(LIBPATH) -o $@  $^

# L'hyperboloïde
bin/tests/testHyperboloide.exe : bin/objets/tests/testHyperboloide.o	\
$(OBJALGEBRE) bin/objets/Couleur.o bin/objets/ComposantCouleur.o	\
bin/objets/Rayon.o bin/objets/Formes/Forme.o				\
bin/objets/Formes/Plan.o bin/objets/Utils/Erreur.o			\
bin/objets/Utils/debugstreams.o bin/objets/Utils/CColor.o		\
bin/objets/Utils/StatusCode.o bin/objets/Formes/BaseHyperboloide.o	\
bin/objets/Formes/Hyperboloide.o bin/objets/Formes/FormeInfinie.o	\
bin/objets/Formes/FormeComposee.o
	g++ $(LIBPATH) -o $@  $^

# La méta-balle
bin/tests/testMetaBalle.exe : libs bin/objets/tests/testMetaBalle.o	\
bin/objets/Couleur.o bin/objets/ComposantCouleur.o			\
bin/objets/Rayon.o bin/objets/Formes/Forme.o bin/objets/Objet.o		\
bin/objets/Ecran.o bin/objets/Camera.o bin/objets/Cellule.o		\
bin/objets/Environnement.o
	g++ $(LIBPATH) -o $@ $(filter-out libs, $^) $(ALLLIBS)	\
 $(ALLLIBS) $(ALLLIBS) $(LIBPATH)

# Teste le bruit de perlin (nouvelle implémentation)
bin/tests/testBruit.exe: bin/objets/Algebre/Coord.o			\
bin/objets/Couleur.o bin/objets/ComposantCouleur.o			\
bin/objets/Bruit/Bruit.o bin/objets/Ecran.o bin/objets/Image/Image.o	\
bin/objets/Image/ImageFile.o bin/objets/Image/ImageFilePPM.o		\
bin/objets/Utils/Erreur.o bin/objets/tests/testBruit.o			\
bin/objets/Materiaux/Melange.o bin/objets/Utils/debugstreams.o		\
bin/objets/Utils/CColor.o
	g++ $(LIBPATH) -o $@ $^

# Teste la nouvelle implémentation du parseur XML
bin/tests/testParser.exe: bin/objets/Xml/Parser.o		\
bin/objets/Xml/ElementDOM.o bin/objets/Utils/debugstreams.o	\
bin/objets/Utils/CColor.o bin/objets/tests/testParser.o		\
bin/objets/Utils/StatusCode.o
	g++ $(LIBPATH) -o $@ $^

# Sous ensemble Algebre
bin/objets/Algebre/%.o : src/Algebre/%.cpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $^

# Sous ensemble Bruit
bin/objets/Bruit/%.o : src/Bruit/%.cpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

# Sous ensemble Formes
bin/objets/Formes/%.o : src/Formes/%.cpp src/Formes/%.hpp	\
src/Formes/Forme.hpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

# Sous ensemble Image
bin/objets/Image/%.o : src/Image/%.cpp src/Image/%.hpp src/Ecran.hpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

# Sous ensemble Lumieres
bin/objets/Lumieres/%.o : src/Lumieres/%.cpp src/Lumieres/%.hpp	\
src/Lumieres/Lumiere.hpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

# Sous ensemble Materiaux
bin/objets/Materiaux/%.o : src/Materiaux/%.cpp src/Materiaux/%.hpp	\
src/Materiaux/Materiau.hpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

# Sous ensemble tests
bin/objets/tests/%.o : src/tests/%.cpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $^

# Sous ensemble Utils
bin/objets/Utils/%.o : src/Utils/%.cpp src/Utils/%.cpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

# Sous ensemble Xml
bin/objets/Xml/%.o : src/Xml/%.cpp src/Xml/%.hpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

# Sous ensemble Noyau
bin/objets/Noyau/%.o : src/Noyau/%.cpp src/Noyau/%.hpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

# Sous ensemble basique
bin/objets/%.o : src/%.cpp src/%.hpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

bin/objets/RJRay.o : src/RJRay.cpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<

bin/objets/RJRay-batch.o : src/RJRay-batch.cpp
	$(CXX) -c $(CXXFLAGS) $(INCPATH) $(LIBPATH) -o $@ $<
